Bug 270

Bug Description:

This is a deadlock.
The following is an example deadlock thread dump:

"Thread2": waiting to lock monitor 0x00000000076cf768 (object 0x00000000eb99b778, 
    a org.apache.commons.dbcp.PoolableConnection), which is held by "Thread1" 
"Thread1": waiting to lock monitor 0x000000000627a360 (object 0x00000000eb913d50, a
    org.apache.commons.pool.impl.GenericObjectPool), which is held by "Thread2"

Java stack information for the threads listed above:
===================================================
Thread1:
    at org.apache.commons.pool.impl.GenericObjectPool.addObjectToPool(GenericObjectPool.java:872) 
      - waiting to lock <0x00000000eb911858> (a org.apache.commons.pool.impl.GenericObjectPool)
    at org.apache.commons.pool.impl.GenericObjectPool.returnObject(GenericObjectPool.java:854) 
    at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:80) 
      - locked <0x00000000eb9b7898> (a org.apache.commons.dbcp.PoolableConnection)
    at Dbcp270$Thread1.run(Dbcp270.java:47)

Thread2:
    at org.apache.commons.dbcp.AbandonedTrace.addTrace(AbandonedTrace.java:173) 
      - waiting to lock <0x00000000eb9b7898> (a org.apache.commons.dbcp.PoolableConnection)
    at org.apache.commons.dbcp.AbandonedTrace.init(AbandonedTrace.java:89)
    at org.apache.commons.dbcp.AbandonedTrace.(AbandonedTrace.java:79)
    at org.apache.commons.dbcp.DelegatingStatement.(DelegatingStatement.java:60)
    at org.apache.commons.dbcp.DelegatingConnection.createStatement(DelegatingConnection.java:161)
    at org.apache.commons.dbcp.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:327)
    at org.apache.commons.dbcp.PoolableConnectionFactory.validateObject (PoolableConnectionFactory.java:308) 
    at org.apache.commons.pool.impl.GenericObjectPool.evict 
      -locked <0x00000000eb911858> (a org.apache.commons.pool.impl.GenericObjectPool)
    at Dbcp270$Thread2.run(Dbcp270.java:67)

More details about this bug are at DBCP-270 JIRA page.

How To Reproduce:

This bug is reproduced under dbcp 1.2 and JDK 1.6_33.
Execute the following scripts to run the test to reproduce the bug (assume the location of the dbcp test project is dbcp_test_home).

Linux:
${dbcp_test_home}/scripts/270.sh [--monitoroff]
Windows:
%dbcp_test_home%/scripts/270.bat [--monitoroff]

Example:

Use monitor to report and terminate the program when deadlock happens:
${dbcp_test_home}/scripts/270.sh

Turn off monitor:
${dbcp_test_home}/scripts/270.sh --monitoroff

Option Function
--monitoroff, -mo Turn off to stop reporting bug messages and ending program when test
runs into the expected concurrency bug which is a deadlock.
User has to terminate the program manually when this option is set.